#region Disclaimer/Info
///////////////////////////////////////////////////////////////////////////////////////////////////
// Subtext WebLog
// 
// Subtext is an open source weblog system that is a fork of the .TEXT
// weblog system.
//
// For updated news and information please visit http://subtextproject.com/
// Subtext is hosted at SourceForge at http://sourceforge.net/projects/subtext
// The development mailing list is at subtext-devs@lists.sourceforge.net 
//
// This project is licensed under the BSD license.  See the License.txt file for more information.
///////////////////////////////////////////////////////////////////////////////////////////////////
#endregion

using System;
using CookComputing.XmlRpc;

namespace CCNet.Community.Plugins.XmlRpc {
  public struct BlogInfo {
    public string blogid;
    public string url;
    public string blogName;
  }

  [XmlRpcMissingMapping ( MappingAction.Ignore )]
  public struct Enclosure {
    public int length;
    public string type;
    public string url;
  }

  [XmlRpcMissingMapping ( MappingAction.Ignore )]
  public struct Source {
    public string name;
    public string url;
  }

  [XmlRpcMissingMapping ( MappingAction.Ignore )]
  public struct Post {
    [XmlRpcMissingMapping ( MappingAction.Error )]
    [XmlRpcMember ( Description = "Required when posting." )]
    public DateTime dateCreated;
    [XmlRpcMissingMapping ( MappingAction.Error )]
    [XmlRpcMember ( Description = "Required when posting." )]
    public string description;
    [XmlRpcMissingMapping ( MappingAction.Error )]
    [XmlRpcMember ( Description = "Required when posting." )]
    public string title;
    [XmlRpcMember ( "categories", Description = "Contains categories for the post." )]
    public string[ ] categories;
    public Enclosure enclosure;
    public string link;
    public string permalink;
    [XmlRpcMember (
      Description = "Not required when posting. Depending on server may "
      + "be either string or integer. "
      + "Use Convert.ToInt32(postid) to treat as integer or "
      + "Convert.ToString(postid) to treat as string" )]
    public object postid;
    public Source source;
    public string userid;
  }

  [XmlRpcMissingMapping ( MappingAction.Ignore )]
  public struct Category {
    public string categoryId;
    public string parentId;
    public string description;
    public string categoryName;
    public string htmlUrl;
    public string rssUrl;
    public string title;
    public override string ToString ( ) {
      if ( categoryName != null )
        return categoryName;
      if ( title != null )
        return title;
      return description;
    }
  }

  public struct mediaObject {
    public string name;
    public string type;
    public Byte[ ] bits;
  }

  public struct mediaObjectInfo {
    public string url;
  }

  [XmlRpcMissingMapping ( MappingAction.Ignore )]
  public struct Link {
    public string link_id;
    public string link_url;
    public string link_title;
    public string link_description;
    public string link_visible;
    public string link_rel;
  }

  [XmlRpcMissingMapping ( MappingAction.Ignore )]
  public struct Comment {
    public string postid;
    public DateTime dateCreated;
    public string description;
    public string title;
    public string commentUserName;
    public string commentUserEmail;
    public string commentUserUrl;
    public string commentUserIp;
  }

  public interface IMetaWeblog {
    [XmlRpcMethod ( "metaWeblog.editPost", Description = "Updates and existing post to a designated blog "
      + "using the metaWeblog API. Returns true if completed." )]
    bool editPost (
     string postid,
     string username,
     string password,
     Post post,
     bool publish );

    [XmlRpcMethod ( "metaWeblog.getCategories",
      Description = "Retrieves a list of valid categories for a post "
      + "using the metaWeblog API. Returns the metaWeblog categories "
      + "struct collection." )]
    Category[ ] getCategories (
      string blogid,
      string username,
      string password );

    [XmlRpcMethod ( "metaWeblog.getPost",
      Description = "Retrieves an existing post using the metaWeblog "
      + "API. Returns the metaWeblog struct." )]
    Post getPost (
      string postid,
      string username,
      string password );

    [XmlRpcMethod ( "metaWeblog.getRecentPosts",
      Description = "Retrieves a list of the most recent existing post "
      + "using the metaWeblog API. Returns the metaWeblog struct collection." )]
    Post[ ] getRecentPosts (
      string blogid,
      string username,
      string password,
      int numberOfPosts );

    [XmlRpcMethod ( "metaWeblog.newPost",
      Description = "Makes a new post to a designated blog using the "
      + "metaWeblog API. Returns postid as a string." )]
    string newPost (
      string blogid,
      string username,
      string password,
      Post post,
      bool publish );

    [XmlRpcMethod ( "metaWeblog.newMediaObject",
      Description = "Uploads an image, movie, song, or other media "
      + "using the metaWeblog API. Returns the metaObject struct." )]
    mediaObjectInfo newMediaObject ( object blogid, string username, string password, mediaObject mediaobject );

    #region BloggerAPI Members


    [XmlRpcMethod ( "blogger.deletePost",
       Description = "Deletes a post." )]
    [return: XmlRpcReturnValue ( Description = "Always returns true." )]
    bool deletePost (
      string appKey,
      string postid,
      string username,
      string password,
      [XmlRpcParameter (
         Description = "Where applicable, this specifies whether the blog "
         + "should be republished after the post has been deleted." )]
		  bool publish );

    [XmlRpcMethod ( "blogger.getUsersBlogs",
       Description = "Returns information on all the blogs a given user "
       + "is a member." )]
    BlogInfo[ ] getUsersBlogs (
      string appKey,
      string username,
      string password );

    #endregion
  }
}

